package com.bbva.itradecomex.controller.vistaBanco;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import com.bbva.itradecomex.bo.iface.RankingClientesBO;
import com.bbva.itradecomex.controller.ComunController;
import com.bbva.itradecomex.domain.BancoRankClienteResultado;
import com.bbva.itradecomex.form.RankingClienteBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;

@Controller
@RequestScoped
@ManagedBean
public class RankingClientesController {
	private static final Logger log = Logger.getLogger(RankingClientesController.class);
	@Autowired
	private RankingClientesBO rankingClientesBO;
	private List<BancoRankClienteResultado> listaBClientesResultadoImportaciones;
	private List<BancoRankClienteResultado> listaBClientesResultadoExportaciones;
	private List<BancoRankClienteResultado> listaBClientesResultadoImpoExpo;
	
	BancoRankClienteResultado subTotalClienteConClaveImp;
	BancoRankClienteResultado subTotalClienteSinClaveImp;
	BancoRankClienteResultado totalClienteImp;
	
	BancoRankClienteResultado subTotalClienteConClaveExp;
	BancoRankClienteResultado subTotalClienteSinClaveExp;
	BancoRankClienteResultado totalClienteExp;
	
	BancoRankClienteResultado subTotalClienteConClaveImpExp;
	BancoRankClienteResultado subTotalClienteSinClaveImpExp;
	BancoRankClienteResultado totalClienteImpExp;
	
	RankingClienteBusquedaForm busquedaForm;

	Integer idxTabResult;
	
	public void onPageLoad(ComponentSystemEvent event){
		try {
			if(!FacesContext.getCurrentInstance().isPostback()){
				//Limpiar
				System.out.println("ingres a !isPostBack...");
				this.listaBClientesResultadoImportaciones=null;
				this.listaBClientesResultadoExportaciones=null;
				this.listaBClientesResultadoImpoExpo=null;
				this.subTotalClienteConClaveImp = null;
				this.subTotalClienteSinClaveImp=null;
				this.totalClienteImp=null;
				
				this.subTotalClienteConClaveExp=null;
				this.subTotalClienteSinClaveExp=null;
				this.totalClienteExp=null;
				
				this.subTotalClienteConClaveImpExp=null;
				this.subTotalClienteSinClaveImpExp=null;
				this.totalClienteImpExp=null;
				
				this.busquedaForm = new RankingClienteBusquedaForm();
				
				Calendar cal = Calendar.getInstance();
				cal.set(Calendar.YEAR, cal.get(Calendar.YEAR));
				cal.set(Calendar.MONTH, 0);
				cal.set(Calendar.DAY_OF_MONTH, 1);
				busquedaForm.setDtFechaIni(cal.getTime());
				busquedaForm.setDtFechaFin(Calendar.getInstance().getTime());
				
				this.cargarDatos();
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	public void validaRangoFechas(DateSelectEvent event) { 
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
    }

	public void validateDateChange(AjaxBehaviorEvent event){
		if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
		}
	}
	public void cargarDatos() throws Exception{
		ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
				.getBean("comunController");
		comunController.inicializarValores();
		comunController.cargarExclusividadAladi();
		comunController.cargarExclusividadBancos();
		comunController.cargarExclusividadBancosClave();
	}
	

	public String exportPDFRankingClientes(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoImportaciones(), this.getBusquedaForm(),this.getSubTotalClienteConClaveImp(),this.getSubTotalClienteSinClaveImp(), this.getTotalClienteImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 1://EXPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoExportaciones(), this.getBusquedaForm(),this.getSubTotalClienteConClaveExp(),this.getSubTotalClienteSinClaveExp(), this.getTotalClienteExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
				case 2://IMPORTACIONES Y EXPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoImpoExpo(), this.getBusquedaForm(),this.getSubTotalClienteConClaveImpExp(),this.getSubTotalClienteSinClaveImpExp(), this.getTotalClienteImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_PDF);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}
	public String exportXLSRankingClientes(){
		try {
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_IMPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoImportaciones(), this.getBusquedaForm(),this.getSubTotalClienteConClaveImp(),this.getSubTotalClienteSinClaveImp(), this.getTotalClienteImp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 1://EXPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_EXPORTACION_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoExportaciones(), this.getBusquedaForm(),this.getSubTotalClienteConClaveExp(),this.getSubTotalClienteSinClaveExp(), this.getTotalClienteExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
				case 2://IMPORTACIONES Y EXPORTACIONES
					rankingClientesBO.generaPDFRankingCliente(Constantes.TIPO_IMPOEXPO_VAL, FacesContext.getCurrentInstance(), this.getListaBClientesResultadoImpoExpo(), this.getBusquedaForm(),this.getSubTotalClienteConClaveImpExp(),this.getSubTotalClienteSinClaveImpExp(), this.getTotalClienteImpExp(),Constantes.TIPO_ARCHIVO_EXPORTACION_XLS);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			log.error(e1.getMessage(),e1);
		}
		return null;
	}

	public void buscarRankingClientes(ActionEvent event){
		try {
			if(ITradexUtil.esFecha1MayorFecha2(this.getBusquedaForm().getDtFechaIni(), this.getBusquedaForm().getDtFechaFin())){
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
						MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_VALIDA_FECHA"),
						MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_VALIDA_FECHA")));
				return;
			}
			ComunController comunController = (ComunController)FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance())
					.getBean("comunController");
			if(comunController.getPaisSeleccionado()!=null){
				this.getBusquedaForm().setStrCodPais(comunController.getPaisSeleccionado().getCodPais());
				this.getBusquedaForm().setStrDescPais(comunController.getPaisSeleccionado().getDescripcion());
			}	
			if(comunController.getBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodBanco(comunController.getBancoSeleccionado().getCodBanco());
				this.getBusquedaForm().setStrDescBanco(comunController.getBancoSeleccionado().getDescBanco1());
			}
			if(comunController.getExclusivBancoSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluGrupo(comunController.getExclusivBancoSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluGrupo(comunController.getExclusivBancoSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivBancoClaveSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluClave(comunController.getExclusivBancoClaveSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluClave(comunController.getExclusivBancoClaveSeleccionado().getDescripcion());
			}
			if(comunController.getExclusivAladiSeleccionado()!=null){
				this.getBusquedaForm().setStrCodExcluOpera(comunController.getExclusivAladiSeleccionado().getValor1());
				this.getBusquedaForm().setStrExcluOpera(comunController.getExclusivAladiSeleccionado().getDescripcion());
			}
			
			switch(idxTabResult){//IDX TABULADOR
				case 0://IMPORTACIONES
					this.setListaBClientesResultadoImportaciones(rankingClientesBO.getListRankingClienteImport(busquedaForm));
					//Importaciones
					subTotalClienteConClaveImp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalClienteSinClaveImp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalClienteImp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					rankingClientesBO.setearTotales(subTotalClienteConClaveImp,subTotalClienteSinClaveImp,totalClienteImp,this.getListaBClientesResultadoImportaciones());
					break;
				case 1://EXPORTACIONES
					this.setListaBClientesResultadoExportaciones(rankingClientesBO.getListRankingClienteExport(busquedaForm));
					// Exportaciones
					subTotalClienteConClaveExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalClienteSinClaveExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalClienteExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					rankingClientesBO.setearTotales(subTotalClienteConClaveExp,subTotalClienteSinClaveExp,totalClienteExp,this.getListaBClientesResultadoExportaciones());
					break;
				case 2://IMPORTACIONES Y EXPORTACIONES
					this.setListaBClientesResultadoImpoExpo(rankingClientesBO.getListRankingClienteImpExp(busquedaForm));
					// Importaciones-Exportaciones
					subTotalClienteConClaveImpExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					subTotalClienteSinClaveImpExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					totalClienteImpExp = (new BancoRankClienteResultado("", "", new BigDecimal(0), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0),new BigDecimal(0)));
					rankingClientesBO.setearTotales(subTotalClienteConClaveImpExp,subTotalClienteSinClaveImpExp,totalClienteImpExp,this.getListaBClientesResultadoImpoExpo());
					break;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}


	public RankingClientesBO getRankingClientesBO() {
		return rankingClientesBO;
	}


	public void setRankingClientesBO(RankingClientesBO rankingClientesBO) {
		this.rankingClientesBO = rankingClientesBO;
	}


	public List<BancoRankClienteResultado> getListaBClientesResultadoImportaciones() {
		return listaBClientesResultadoImportaciones;
	}


	public void setListaBClientesResultadoImportaciones(
			List<BancoRankClienteResultado> listaBClientesResultadoImportaciones) {
		this.listaBClientesResultadoImportaciones = listaBClientesResultadoImportaciones;
	}


	public List<BancoRankClienteResultado> getListaBClientesResultadoExportaciones() {
		return listaBClientesResultadoExportaciones;
	}


	public void setListaBClientesResultadoExportaciones(
			List<BancoRankClienteResultado> listaBClientesResultadoExportaciones) {
		this.listaBClientesResultadoExportaciones = listaBClientesResultadoExportaciones;
	}


	public List<BancoRankClienteResultado> getListaBClientesResultadoImpoExpo() {
		return listaBClientesResultadoImpoExpo;
	}


	public void setListaBClientesResultadoImpoExpo(
			List<BancoRankClienteResultado> listaBClientesResultadoImpoExpo) {
		this.listaBClientesResultadoImpoExpo = listaBClientesResultadoImpoExpo;
	}


	public BancoRankClienteResultado getSubTotalClienteConClaveImp() {
		return subTotalClienteConClaveImp;
	}


	public void setSubTotalClienteConClaveImp(
			BancoRankClienteResultado subTotalClienteConClaveImp) {
		this.subTotalClienteConClaveImp = subTotalClienteConClaveImp;
	}


	public BancoRankClienteResultado getSubTotalClienteSinClaveImp() {
		return subTotalClienteSinClaveImp;
	}


	public void setSubTotalClienteSinClaveImp(
			BancoRankClienteResultado subTotalClienteSinClaveImp) {
		this.subTotalClienteSinClaveImp = subTotalClienteSinClaveImp;
	}


	public BancoRankClienteResultado getTotalClienteImp() {
		return totalClienteImp;
	}


	public void setTotalClienteImp(BancoRankClienteResultado totalClienteImp) {
		this.totalClienteImp = totalClienteImp;
	}


	public BancoRankClienteResultado getSubTotalClienteConClaveExp() {
		return subTotalClienteConClaveExp;
	}


	public void setSubTotalClienteConClaveExp(
			BancoRankClienteResultado subTotalClienteConClaveExp) {
		this.subTotalClienteConClaveExp = subTotalClienteConClaveExp;
	}


	public BancoRankClienteResultado getSubTotalClienteSinClaveExp() {
		return subTotalClienteSinClaveExp;
	}


	public void setSubTotalClienteSinClaveExp(
			BancoRankClienteResultado subTotalClienteSinClaveExp) {
		this.subTotalClienteSinClaveExp = subTotalClienteSinClaveExp;
	}


	public BancoRankClienteResultado getTotalClienteExp() {
		return totalClienteExp;
	}


	public void setTotalClienteExp(BancoRankClienteResultado totalClienteExp) {
		this.totalClienteExp = totalClienteExp;
	}


	public BancoRankClienteResultado getSubTotalClienteConClaveImpExp() {
		return subTotalClienteConClaveImpExp;
	}


	public void setSubTotalClienteConClaveImpExp(
			BancoRankClienteResultado subTotalClienteConClaveImpExp) {
		this.subTotalClienteConClaveImpExp = subTotalClienteConClaveImpExp;
	}


	public BancoRankClienteResultado getSubTotalClienteSinClaveImpExp() {
		return subTotalClienteSinClaveImpExp;
	}


	public void setSubTotalClienteSinClaveImpExp(
			BancoRankClienteResultado subTotalClienteSinClaveImpExp) {
		this.subTotalClienteSinClaveImpExp = subTotalClienteSinClaveImpExp;
	}


	public BancoRankClienteResultado getTotalClienteImpExp() {
		return totalClienteImpExp;
	}


	public void setTotalClienteImpExp(BancoRankClienteResultado totalClienteImpExp) {
		this.totalClienteImpExp = totalClienteImpExp;
	}
	
	public RankingClienteBusquedaForm getBusquedaForm() {
		return busquedaForm;
	}


	public void setBusquedaForm(RankingClienteBusquedaForm busquedaForm) {
		this.busquedaForm = busquedaForm;
	}
	

	public Integer getIdxTabResult() {
		return idxTabResult;
	}

	public void setIdxTabResult(Integer idxTabResult) {
		this.idxTabResult = idxTabResult;
	}

	
	
}
